package com.gitee.qdbp.general.common.api.sequence.service;

import com.gitee.qdbp.able.exception.ServiceException;
import com.gitee.qdbp.general.common.api.sequence.model.SequenceBean;

/**
 * 远程(例如数据库)序列号生成器
 *
 * @author zhaohuihua
 * @version 170722
 */
public interface IRemoteSequenceGenerator {

    /**
     * 生成一个新的序号
     * 
     * @param type 类型
     * @param subtypes 子类型
     * @return 序号
     * @throws ServiceException
     */
    String generate(String type, String... subtypes) throws ServiceException;

    /**
     * 生成一个新的序号
     * 
     * @param type 类型
     * @param subtypes 子类型
     * @return 序号
     * @throws ServiceException
     */
    default String generate(Enum<?> type, String... subtypes) throws ServiceException {
        return generate(type.name(), subtypes);
    }

    /**
     * 查询序号的当前值
     * 
     * @param type 类型
     * @param subtypes 子类型
     * @return 当前序号
     * @throws ServiceException
     */
    String query(String type, String... subtypes) throws ServiceException;

    /**
     * 查询序号的当前值
     * 
     * @param type 类型
     * @param subtypes 子类型
     * @return 当前序号, 如果没有当前值, 返回null
     * @throws ServiceException
     */
    default String query(Enum<?> type, String... subtypes) throws ServiceException {
        return query(type.name(), subtypes);
    }

    /**
     * 生成一个新的序号
     * 
     * @param type 类型
     * @param subtypes 子类型
     * @return 序号
     * @throws ServiceException
     */
    SequenceBean execute(String type, String... subtypes) throws ServiceException;

    /**
     * 生成一个新的序号
     * 
     * @param type 类型
     * @param subtypes 子类型
     * @return 序号
     * @throws ServiceException
     */
    default SequenceBean execute(Enum<?> type, String... subtypes) throws ServiceException {
        return execute(type.name(), subtypes);
    }
}
